# 1. 第一个参数（位置参数）: args
# : 'ls'
# 含义: 指定要执行的命令及其参数。这里是一个列表，其中：
# 注意: 使用列表形式可以避免shell注入攻击，并且能正确处理参数中的空格和特殊字符。此方式不会启动额外的shell（除非指定shell=True），而是直接执行程序。
# 2. stdout=subprocess.PIPE
# 含义: 将子进程的标准输出（stdout）重定向到一个管道（pipe）。这意味着子进程的任何标准输出都不会打印到终端，而是被重定向到管道中，父进程（即这个Python脚本）可以通过process.stdout来读取这些输出。
# 用途: 当你需要捕获命令的输出以便在Python中处理时使用。
# 3. stderr=subprocess.PIPE
# 含义: 将子进程的标准错误（stderr）重定向到一个管道。同样，错误信息也不会打印到终端，而是可以通过process.stderr读取。
# 用途: 捕获错误输出。在这个例子中，由于nonexistent_file不存在，命令ls会产生错误信息，这个信息会被捕获到stderr管道中。
# 4. text=True
# 含义: 指示子进程的输入和输出以文本模式（即字符串）处理，而不是字节模式。
# 效果: 如果不设置text=True（或universal_newlines=True），那么从管道读取的会是字节串（bytes）类型。设置后，则读取的是字符串（str）类型。
# 注意: 使用此选项时，Python会根据系统默认的编码（如UTF-8）来解码字节数据。你也可以通过encoding参数指定编码。
import subprocess
from time import sleep

mac_start = f"appium -a 127.0.0.1 -p {4723} --session-override"
subprocess.Popen(
    mac_start,
    shell=True,
    stdout=True,
    stderr=subprocess.STDOUT,
)
sleep(3)
